#include "wifi.h"

int connect_flag = 0; // 是否连接成功的标志
int tt_flag = 0;	  // 是否有网络发过来的透传数据标志

char WIFI_Config0(int time) // 找到ready 返回 没有找到返回1
{
    memset(WiFi_RX_BUF, 0, 1024);
    WiFi_RxCounter = 0;
    while (time--)
    {
        HAL_Delay(100);
        if (strstr((char *)WiFi_RX_BUF, "ready"))
        {
            break;
        }
        // u1_USART ("WIFI_Config0:=%s",WiFi_RX_BUF);
    }
    if (time > 0)
        return 0;
    else
        return 1;
}

char WIFI_Config(int time, char *cmd, char *response) // 等待时间 发送内容 判断返回的内容
{
    memset(WiFi_RX_BUF, 0, 1024);
    WiFi_RxCounter = 0;
    ESP8266_USART("%s\r\n", cmd);
    while (time--)
    {
        HAL_Delay(100);
        if (strstr((char *)WiFi_RX_BUF, response))
        {
            break;
        }
        // u1_USART("%d ", time);
    }
    if (time > 0)
        return 0;
    else
        return 1;
}

char WIFI_Router(int time) // 配置WIFI名和密码
{
    memset(WiFi_RX_BUF, 0, 1024);
    WiFi_RxCounter = 0;
    //	ESP8266_USART("AT+CIPMUX=0");
    //	HAL_Delay(100);
    ESP8266_USART("AT+CWJAP=\"%s\",\"%s\"\r\n", ID, PASSWORD);
    while (time--)
    {
        HAL_Delay(1000);
        if (strstr((char *)WiFi_RX_BUF, "OK"))
        {
            break;
        }
        u1_USART("连接路由倒计时: %d\r\n ", time);
    }
    if (time > 0)
        return 0;
    else
        return 1;
}

char WIFI_ConnectTCP(int time) // 配置TCP
{
    memset(WiFi_RX_BUF, 0, 1024);
    WiFi_RxCounter = 0;
    ESP8266_USART("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ServerIP, ServerPort);
    while (time--)
    {
        HAL_Delay(100);
        if (strstr((char *)WiFi_RX_BUF, "OK"))
        {
            break;
        }
        u1_USART("正在建立TCP连接 ：%d ", time);
    }
    if (time > 0)
        return 0;
    else
        return 1;
}

enum WIFI_STATE
{
    WIFI_READY = 0,
    WIFI_CONFIG1,
    WIFI_ROUTER,
    WIFI_CONFIG2,  //进入透传模式
    WIFI_CONNECT, //连接服务器
    WIFI_CONFIG3,
    WIFI_COMPLETE	//连接完成
};

#define WAIT_TIME 1000

void WIFI_Connect()//状态机 
{
    int state = WIFI_READY;  //默认等待复位
    while (1)
    {
        if(state == WIFI_COMPLETE)
        {
            u1_USART("连接服务器完成并开启透传!\r\n");
			memset(USART5_RxBuff,0,1024);
            //WIFI_SendData("hello world");
            break;  //这里直接跳出while(1)循环即可
        }
        switch (state)
        {
        case WIFI_READY://检测是否手动复位了
            /*0、按键复位*/
            u1_USART("0、准备按键复位!\r\n");
            if (WIFI_Config0(100))//判是否收到ready
            {
                u1_USART("按键复位失败!\r\n");
                HAL_Delay(WAIT_TIME);
            }
            else//成功了 找到了
            {
                u1_USART("按键复位成功!\r\n");
                state = WIFI_CONFIG1;
            }
            break;

        case WIFI_CONFIG1:
            /*1、配置WIFI模式*/
            u1_USART("1、准备配置WIFI模式!\r\n");
            if (WIFI_Config(50, "AT+CWMODE=1\r\n", "OK"))//发送命令 检测OK
            {
                u1_USART("配置WIFI模式失败!\r\n");
                HAL_Delay(WAIT_TIME);
                break;
            }
            else//成功
                u1_USART("配置WIFI模式成功!\r\n");
				u1_USART("\r\n");
            /*2、重启(命令方式)*/
            u1_USART("2、准备复位!\r\n");
            if (WIFI_Config(50, "AT+RST\r\n", "ready"))
            {
                u1_USART("复位失败!\r\n");
                HAL_Delay(WAIT_TIME);
                break;
            }
            else
                u1_USART("复位成功!\r\n");
            u1_USART("\r\n");
            /*3、取消自动连接*/
            u1_USART("3、准备取消自动连接\r\n");
            if (WIFI_Config(50, "AT+CWAUTOCONN=0\r\n", "OK"))//取消热点自动连接 检测OK
            {
                u1_USART("取消自动连接失败!\r\n");
                HAL_Delay(WAIT_TIME);
                break;
            }
            else
                u1_USART("取消自动连接成功!\r\n");

            WiFi_RxCounter = 0;
            state = WIFI_ROUTER;
            break;
        case WIFI_ROUTER:
            /*4、连接路由器*/
            u1_USART("4、准备连接路由器\r\n");
            if (WIFI_Router(50))//连接热点并检测是否连接成功
            {
                u1_USART("连接路由器失败!\r\n");
                HAL_Delay(WAIT_TIME);
            }
            else
            {
                u1_USART("连接路由器成功!\r\n");
                state = WIFI_CONFIG2;
            }
            break;
        case WIFI_CONFIG2:
            /*5、配置单路连接模式*/

            /*6、开启透传模式*/
            u1_USART("6、配置透传模式\r\n");
            if (WIFI_Config(50, "AT+CIPMODE=1\r\n", "OK"))
            {
                u1_USART("配置透传模式失败!\r\n");
                HAL_Delay(WAIT_TIME);
                break;
            }
            else
            {
                u1_USART("配置透传模式成功!\r\n");
            }
            state = WIFI_CONNECT;
            break;
        case WIFI_CONNECT:
            /*7、建立TCP连接*/
            u1_USART("7、准备建立TCP连接\r\n");
            if (WIFI_ConnectTCP(50))//连接TCP
            {
                u1_USART("建立TCP连接失败!\r\n");
                HAL_Delay(WAIT_TIME);
            }
            else
            {
                u1_USART("建立TCP连接成功!\r\n");
                state = WIFI_CONFIG3;
            }
            break;
        case WIFI_CONFIG3:
            /*8、进入透传模式*/
            u1_USART("8、准备进入透传模式\r\n");
            if (WIFI_Config(50, "AT+CIPSEND\r\n", "OK"))
            {
                u1_USART("进入透传模式失败!\r\n");
                HAL_Delay(WAIT_TIME);
            }
            else
            {
                u1_USART("进入透传模式成功!\r\n");
                state = WIFI_COMPLETE;
                connect_flag = 1;
                break;
            }
        default:
            break;
        }
    }
}

//int WIFI_SendData(const char *data)
//{
//	ESP8266_USART("%s", data);
//	//u1_USART("数据发送完成\r\n");
//	return 0;
//	if (WIFI_Config(10, "AT+CIPSEND=5\r\n", ">"))
//	{
//		ESP8266_USART("%s", data);
//		u1_USART("数据发送完成\r\n");
//		return 0;
//	}
//	else
//	{
//		u1_USART("数据发送失败!\r\n");
//		return -1;
//	}
//}